package Graficas;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.sound.sampled.Clip;
import javax.swing.JComponent;
import javax.swing.JPanel;

import General.Constantes;

/**
 * Panel del juego donde se pintara el juego grafico. Ademas permite captar las teclas presionadas
 * por el usuario, e interactuar con el juego grafico.
 * 
 * @author Mariano Rodecker
 * @author Matias Varela
 * 
 */
public class panelJuego extends JComponent implements KeyListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private JuegoGrafico graphicGame;
	private MenuJuego menuJuego;
	private hiloPintado hiloPaint;

	/**
	 * Constructor para un panel de juego. Recibe un menuJuego el cual le permite a esta clase
	 * interactuar con el menu principal del programa.
	 * 
	 * @param menuJuego
	 */
	public panelJuego(MenuJuego menuJuego) {
		super();
		initGUI();	
		this.menuJuego = menuJuego;
	}

	private void initGUI() {
		try {
			setPreferredSize(new Dimension(Constantes.width_MapaVisible, Constantes.height_MapaVisible));
			setBackground(new Color(0, 149, 253));
			addKeyListener(this);
			setFocusable(true);
			grabFocus();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Inicia la ejecucion del juego logico y grafico.
	 */
	public void iniciarJuego(int cantVidasMario,int cantPuntos) {
		graphicGame = new JuegoGrafico(this);

		graphicGame.getJuegoLogico().getMario().setVidas(cantVidasMario);
		graphicGame.getJuegoLogico().getMario().aumentarPuntos(cantPuntos);
		graphicGame.getJuegoLogico().correrJuego();
		hiloPaint = new hiloPintado();
		hiloPaint.start();
	}
	public void detener(boolean volverAEjecutar,int vidas,int puntos){
		graphicGame.detener();
		hiloPaint.parar();
		menuJuego.restaurar(volverAEjecutar,vidas,puntos);
	}
	/*
	 * Este hilo realiza el pintado del juego grafico.
	 */
	private class hiloPintado extends Thread {
		private boolean continuo;

		public hiloPintado() {
			super("1");
			continuo = true;
		}

		public void run() {
			graphicGame.getSoundtrack().reproducir(Clip.LOOP_CONTINUOUSLY);
			while (!graphicGame.isFinalizado() && continuo) {
				repaint();
				try {
					sleep(10);
				} catch (InterruptedException e) {
				}
			}
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

			/*
			 * si finalizo la ejecucion del hilo, significa que el juego grafico y el juego logico
			 * han finalizado por alguna razon, si el sonido de gameOver se encontraba en ejecucion
			 * entonces detengo su reproduccion
			 */
			parar();
			if (graphicGame.isFinalizado())
				menuJuego.restaurar(false, 0,0);
			

		}

		/*
		 * Permite para la ejecucion del juego y volver al menu principal.
		 */
		public void parar() {
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			continuo = false;

			if (graphicGame.getSoundtrackGameOver().isRunning())
				graphicGame.getSoundtrackGameOver().stop();
			if (graphicGame.soundtrack.isRunning()){
				graphicGame.getSoundtrack().stop();
			}
		}
	}

	@Override
	public void keyPressed(KeyEvent key) {

		if (key.getKeyCode() == KeyEvent.VK_LEFT)
			graphicGame.getJuegoLogico().pressKey_left(true);
		else if (key.getKeyCode() == KeyEvent.VK_RIGHT)
			graphicGame.getJuegoLogico().pressKey_right(true);
		else if (key.getKeyCode() == KeyEvent.VK_UP)
			graphicGame.getJuegoLogico().pressKey_up(true);
		else if (key.getKeyCode() == KeyEvent.VK_DOWN)
			graphicGame.getJuegoLogico().pressKey_down(true);
		else if (key.getKeyCode() == KeyEvent.VK_ESCAPE && hiloPaint.isAlive()) {
			detener(false,0,0);
		}

		if (key.getKeyChar() == 'z' || key.getKeyChar() == 'Z')
			graphicGame.getJuegoLogico().pressKey_z(true);

	}

	@Override
	public void keyReleased(KeyEvent key) {
		if (key.getKeyCode() == KeyEvent.VK_LEFT)
			graphicGame.getJuegoLogico().pressKey_left(false);
		else if (key.getKeyCode() == KeyEvent.VK_RIGHT)
			graphicGame.getJuegoLogico().pressKey_right(false);
		else if (key.getKeyCode() == KeyEvent.VK_UP)
			graphicGame.getJuegoLogico().pressKey_up(false);
		else if (key.getKeyCode() == KeyEvent.VK_DOWN)
			graphicGame.getJuegoLogico().pressKey_down(false);
		else if (key.getKeyCode()==KeyEvent.VK_SPACE)
			graphicGame.getJuegoLogico().getMario().getCaracteristica().disparar();
		if (key.getKeyChar() == 'z' || key.getKeyChar() == 'Z')
			graphicGame.getJuegoLogico().pressKey_z(false);
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	public void paint(Graphics g) {
		super.paint(g);
		graphicGame.paint(g);
	}

}
